FUNCTION Z_BC_CREATE_RESERVATION_BAPI.
*"----------------------------------------------------------------------
*"*"Local Interface:
*"  IMPORTING
*"     VALUE(I_REPROCESS) TYPE  CHAR1 OPTIONAL
*"     VALUE(I_MINDEX) TYPE  SYINDEX OPTIONAL
*"  EXPORTING
*"     VALUE(E_RETURN) TYPE  CHAR1
*"  TABLES
*"      RESERVATIONS STRUCTURE  ZBC_M2S_RESERVATIONS
*"      RETURN STRUCTURE  BAPIRET2 OPTIONAL
*"----------------------------------------------------------------------
************************************************************************
*                                                                      *
* Licensed Materials - Property of IBM                                 *
*                                                                      *
* Restricted Materials of IBM                                          *
*                                                                      *
* 5724-M19                                                             *
*                                                                      *
* (C) COPYRIGHT IBM CORP. 2008. All Rights Reserved.                   *
*                                                                      *
* US Government Users Restricted Rights - Use, duplication or          *
* disclosure restricted by GSA ADP Schedule Contract with IBM Corp.    *
*                                                                      *
************************************************************************
* Version     : ECC60-0000-0001     XI/BusinessConnector               *
*               Standard                                               *
* Created on  : 30-Aug-2006                                            *
* Last Update : 23-Sep-2008                                            *
*----------------------------------------------------------------------*
*                                                                      *
* Change History :                                                     *
*   Date      Programer                   Action                       *
* =========== ========= ============================================== *
* 23-Sep-2008 sbu       changed WBS_ELEM to WBS_ELEMENT (issue08-21959)*
*                                                                      *
*                                                                      *
*                                                                      *
************************************************************************
* MAX to SAP : Create Reservations - BAPI Processing                   *
************************************************************************

*** Data Definition ****************************************************
  DATA:
    FIELDNAME LIKE BDCDATA-FNAM,
    TABIX_CHAR(2),
    LOOP_COUNTER LIKE SY-TABIX,
    S_RSNUM TYPE RESB-RSNUM,
    RESERVATIONHEADER TYPE	BAPI2093_RES_HEAD,
    RESERVATIONITEMS TYPE BAPI2093_RES_ITEM OCCURS 0 WITH HEADER LINE,
    PROFITABILITYSEGMENT TYPE BAPI_PROFITABILITY_SEGMENT
                         OCCURS 0 WITH HEADER LINE,
    BAPI_RETURN_C TYPE BAPIRET2 OCCURS 0 WITH HEADER LINE,
    I_MSGID TYPE SY-MSGID,
    I_MSGNO TYPE SY-MSGNO,
    REVERSAL(1),
    DBCNT LIKE SY-DBCNT,
    COMPDATE LIKE SY-DATUM,
    COMPDATE1 LIKE RESERVATIONS-MRSDAT.


  COMPDATE = SY-DATUM.
  CONCATENATE COMPDATE(4) '/' COMPDATE+4(2) '/'  COMPDATE+6(2)
  INTO COMPDATE1.

  REFRESH BDC_TAB.

  READ TABLE RESERVATIONS INDEX 1.
  IF RESERVATIONS-MRSDAT < COMPDATE1.
    RESERVATIONS-MRSDAT = COMPDATE1.
  ENDIF.

  LOOP AT RESERVATIONS.
    LOOP_COUNTER = LOOP_COUNTER + 1.
    IF LOOP_COUNTER = 1.
      IF RESERVATIONS-MRSDAT < COMPDATE1.
        RESERVATIONS-MRSDAT = COMPDATE1.
      ENDIF.
      IF RESERVATIONS-MERFMG < 0 OR RESERVATIONS-MERFMG(1) = '-'.
        RESERVATIONS-MERFMG = ABS( RESERVATIONS-MERFMG ).
        REVERSAL = 'X'.
      ENDIF.

      IF RESERVATIONS-MFLAG = 'K' AND REVERSAL = ' '.
        RESERVATIONS-MBWART = '201'.
      ELSEIF RESERVATIONS-MFLAG = 'K' AND REVERSAL = 'X'.
        RESERVATIONS-MBWART = '202'.
      ELSEIF RESERVATIONS-MFLAG = 'P' AND REVERSAL = ' '.
        RESERVATIONS-MBWART = '221'.
      ELSEIF RESERVATIONS-MFLAG = 'P' AND REVERSAL = 'X'.
        RESERVATIONS-MBWART = '222'.
      ELSEIF RESERVATIONS-MFLAG = 'A' AND REVERSAL = ' '.
        RESERVATIONS-MBWART = '241'.
      ELSEIF RESERVATIONS-MFLAG = 'A' AND REVERSAL = 'X'.
        RESERVATIONS-MBWART = '242'.
      ELSEIF RESERVATIONS-MFLAG = 'F' AND REVERSAL = ' '.
        RESERVATIONS-MBWART = '261'.
      ELSEIF RESERVATIONS-MFLAG = 'F' AND REVERSAL = 'X'.
        RESERVATIONS-MBWART = '262'.
      ENDIF.

*** RESERVATIONHEADER Data
      RESERVATIONHEADER-RES_DATE   = RESERVATIONS-MRSDAT.
      RESERVATIONHEADER-MOVE_TYPE  = RESERVATIONS-MBWART.
      IF RESERVATIONS-MFLAG = 'K'.
        RESERVATIONHEADER-COSTCENTER = RESERVATIONS-MKOSTL.
      ELSEIF RESERVATIONS-MFLAG = 'P'.
        RESERVATIONHEADER-WBS_ELEMENT = RESERVATIONS-MPSPNR.
      ELSEIF RESERVATIONS-MFLAG = 'A'.
        RESERVATIONHEADER-ASSET_NO = RESERVATIONS-MANLN1.
      ELSEIF RESERVATIONS-MFLAG = 'F'.
        RESERVATIONHEADER-ORDERID    = RESERVATIONS-MAUFNR.
      ENDIF.
    ENDIF.


    IF RESERVATIONS-MERFME CO ' '.
      SELECT SINGLE MEINS FROM MARA INTO RESERVATIONS-MERFME
             WHERE MATNR = RESERVATIONS-MMATNR.
    ENDIF.

*** RESERVATIONITEMS Data
    RESERVATIONITEMS-MATERIAL    = RESERVATIONS-MMATNR.
    RESERVATIONITEMS-PLANT       = RESERVATIONS-MWERKS.
    RESERVATIONITEMS-STGE_LOC    = RESERVATIONS-MLGORT.
    RESERVATIONITEMS-BATCH       = RESERVATIONS-MCHARG.
    RESERVATIONITEMS-ENTRY_QNT   = RESERVATIONS-MERFMG.
    RESERVATIONITEMS-ENTRY_UOM   = RESERVATIONS-MERFME.
    RESERVATIONITEMS-REQ_DATE    = RESERVATIONS-MRSDAT.
    RESERVATIONITEMS-GL_ACCOUNT  = RESERVATIONS-MSAKNR.
    RESERVATIONITEMS-ITEM_TEXT   = RESERVATIONS-MSGTXT.
    RESERVATIONITEMS-GR_RCPT     = RESERVATIONS-MWEMPF.
    RESERVATIONITEMS-FIXED_QUAN  = RESERVATIONS-MFMENG.
    RESERVATIONITEMS-MOVEMENT    = RESERVATIONS-MXWAOK.
    APPEND RESERVATIONITEMS.

  ENDLOOP.

*** BAPI CALL ************************************
  CALL FUNCTION 'BAPI_RESERVATION_CREATE1'
    EXPORTING
      RESERVATIONHEADER    = RESERVATIONHEADER
    IMPORTING
      RESERVATION          = S_RSNUM
    TABLES
      RESERVATIONITEMS     = RESERVATIONITEMS
      PROFITABILITYSEGMENT = PROFITABILITYSEGMENT
      RETURN               = RETURN.


  LOOP AT RETURN WHERE TYPE = 'E' AND ID NE 'BAPI'. ENDLOOP.
  SUBRC = SY-SUBRC.
  IF SUBRC NE 0.
*** Commit Transaction *********************************
    CALL FUNCTION 'BAPI_TRANSACTION_COMMIT'
      IMPORTING
        RETURN = BAPI_RETURN_C.
  ELSE.
*** Rollback Transaction ********************************
    CALL FUNCTION 'BAPI_TRANSACTION_ROLLBACK'
      IMPORTING
        RETURN = BAPI_RETURN_C.
  ENDIF.

*** write datasets into log-table ZBC_MSIF **********************
  IF I_REPROCESS NE 'X'.
    IF SUBRC NE 0.
      SUBRC = 0.
      RETURN-TYPE = 'S'.
      RETURN-MESSAGE_V1 = S_RSNUM.
    ELSE.
      SUBRC = 1001.
    ENDIF.
    SELECT MAX( SYINDEX ) FROM ZBC_MSIF INTO DBCNT.
    READ TABLE RESERVATIONS INDEX 1.
    LOOP AT RESERVATIONS.
      DBCNT = DBCNT + 1.
      PERFORM ARCHIVE_DATASET USING
        DBCNT RESERVATIONS SUBRC RETURN-ID RETURN-TYPE
        RETURN-NUMBER RETURN-MESSAGE_V1
        RETURN-MESSAGE_V2 RETURN-MESSAGE_V3
        RETURN-MESSAGE_V4.
    ENDLOOP.
    " reorganize ZBC_MSIF
    IF DBCNT > 3. PERFORM REORGANIZE_ZBC_MSIF. ENDIF.
  ENDIF.

  LOOP AT RETURN WHERE TYPE = 'E' AND ID NE 'BAPI'. ENDLOOP.

*** Success ********************************************
  IF SY-SUBRC NE 0.

**** Set Return Values ********************************
    E_RETURN = 'S'.
    CLEAR RETURN. REFRESH RETURN.
    RETURN-TYPE = 'S'.
    RETURN-MESSAGE = 'Success'.
    APPEND RETURN.

*** Failure *********************************************
  ELSE.

    READ TABLE RESERVATIONS INDEX 1.
    I_MSGID = RETURN-ID(2).
    I_MSGNO = RETURN-NUMBER(3).

*** determine error handling ***************************
    SELECT  * FROM ZBC_INBPROGRAMS INTO TABLE BDC_ERROR
             WHERE IDENT = RESERVATIONS-MIDENT
             AND  BDCER_MODE_ACT = 'INT'.

*** Internal Error Handling active ***********************
    IF SY-SUBRC = 0 OR I_REPROCESS EQ 'X'.

*** No Reprocess - first time processing *****************
      IF I_REPROCESS NE 'X'.

*** Add Receiver *****************************************
        CLEAR SOMLRECI1. REFRESH SOMLRECI1.
        PERFORM ADD_RECEIVER TABLES BDC_ERROR SOMLRECI1.

*** send mail ********************************************
        CALL FUNCTION 'Z_BC_SEND_MAIL_TO_ADMIN'
          EXPORTING
            MSGID     = I_MSGID
            MSGNO     = I_MSGNO
            MSGV1     = RETURN-MESSAGE_V1
            MSGV2     = RETURN-MESSAGE_V2
            MSGV3     = RETURN-MESSAGE_V3
            MSGV4     = RETURN-MESSAGE_V4
            IDENT     = 'BAPI_MRSVI'
            TIME      = SY-UZEIT
            DATE      = SY-DATUM
          TABLES
            RECEIVERS = SOMLRECI1.

*** insert error in admin table ******************
        READ TABLE RESERVATIONS INDEX 1.

        CALL FUNCTION 'NUMBER_GET_NEXT'
          EXPORTING
            NR_RANGE_NR             = '01'
            OBJECT                  = 'ZMXESERROR'
          IMPORTING
            NUMBER                  = DBCNT
          EXCEPTIONS
            INTERVAL_NOT_FOUND      = 1
            NUMBER_RANGE_NOT_INTERN = 1
            OBJECT_NOT_FOUND        = 1
            INTERVAL_OVERFLOW       = 1
            BUFFER_OVERFLOW         = 1.

        IF SY-SUBRC <> 0.
          SELECT MAX( MINDEX ) FROM ZBC_BAPI_ADMIN INTO DBCNT.
          DBCNT = DBCNT + 1.
        ENDIF.

        ZBC_BAPI_ADMIN-MINDEX = DBCNT.
        ZBC_BAPI_ADMIN-MOBJECT = RESERVATIONS-MSGTXT.
        ZBC_BAPI_ADMIN-MIDENT = RESERVATIONS-MIDENT.
        ZBC_BAPI_ADMIN-TYPE = RETURN-TYPE.
        ZBC_BAPI_ADMIN-CODE = RETURN-ID.
        ZBC_BAPI_ADMIN-MESSAGE = RETURN-MESSAGE.
        ZBC_BAPI_ADMIN-P_DATE = SY-DATUM.
        ZBC_BAPI_ADMIN-P_TIME = SY-UZEIT.
        INSERT ZBC_BAPI_ADMIN.

***** insert error in detail table ******************
        LOOP AT RESERVATIONS.
          ZBC_BAPI_RESERV-MINDEX = DBCNT.
          MOVE-CORRESPONDING RESERVATIONS TO ZBC_BAPI_RESERV.
          INSERT ZBC_BAPI_RESERV.
          SUBRC = '1001'.
        ENDLOOP.

      ELSE.

**** Reprocess : update error in admin table ******************
        SELECT SINGLE * FROM ZBC_BAPI_ADMIN WHERE MINDEX = I_MINDEX.
        ZBC_BAPI_ADMIN-TYPE = RETURN-TYPE.
        ZBC_BAPI_ADMIN-CODE = RETURN-ID.
        ZBC_BAPI_ADMIN-MESSAGE = RETURN-MESSAGE.
        UPDATE ZBC_BAPI_ADMIN FROM ZBC_BAPI_ADMIN.
      ENDIF.

*** internal error handling : set RETURN to S *********************
      CLEAR RETURN. REFRESH RETURN.
      RETURN-TYPE = 'S'.
      RETURN-MESSAGE = 'Success'.
      APPEND RETURN.
    ENDIF.
  ENDIF.
ENDFUNCTION.